{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 1. Sự khác nhau giữa Training và Inference\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<img src=\"./images/Train-versus-Inference.png\" />"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Ảnh từ [Gartner Blog Network](https://blogs.gartner.com/paul-debeasi/2019/02/14/training-versus-inference/)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- **Quá trình training:** Dựa trên tập data được chuẩn bị sẵn trước, train và test một hoặc nhiều models thực hiện các mục đích khác nhau, ví dụ như một model dùng để phân biệt ảnh chó và ảnh mèo như hình bên trên."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- **Quá trình inference:** Khi model đã được train xong, ta cần thiết kế flow để có thể sử dụng cho một hoặc nhiều data mới. Flow này sẽ bao gồm phần nhận input là một dữ liệu mới và trả về ouput là kết quả dự đoán của model."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Nếu bạn là một lập trình viên AI thì mục tiêu không chỉ là train được một model mà còn phải deploy được quá trình inference này dưới nhiều dạng khác nhau và điển hình nhất [Restful API](https://searchmicroservices.techtarget.com/definition/RESTful-API)."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Thật may mắn là Google đã cho ra mắt Tensorflow Serving và họ cũng dùng nó cho Production của họ, vì thế bạn hoàn toàn có thể tin tưởng rằng cấu trúc này có thể phục vụ được hàng tỉ người dùng. :3"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 2. Kiến trúc TensorFlow Serving"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Chú ý rằng TensorFlow Serving là thư viện tách biệt hoàn toàn với Tensorflow nhé."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<img src=\"./images/serving_architecture.png\" />"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Ảnh từ [Tensorflow Website](https://www.tensorflow.org/tfx/serving/architecture)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**4 thành phần chính:**\n",
    "\n",
    "Phần này chủ yếu dành để tham khảo vì hầu như quy trình này được TensorFlow Serving thực hiện tự động\n",
    "\n",
    "- **Servables:** Abstract Class dùng để quản lý các models của bạn, bạn có thể quản lý nhiều models hoặc một model với nhiều phiên bản khác nhau.\n",
    "- **Source:** Nơi lưu trữ files/data\n",
    "- **Manager:** \n",
    "    + quản lý full lifecycle của một Servables (có loading, serving và unloading)\n",
    "    + lắng nghe Source và kiểm tra tất cả các phiên bản\n",
    "- **Loader:** \n",
    "    + Cho phép sử dụng một số hạ tầng thông thường, định nghĩa API quy chuẩn\n",
    "    \n",
    "**2 bước chính:**\n",
    "- Sources tạo ra Loader cho một phiên bản Servable\n",
    "- Loader gửi phiên bản này cho Manager, phần phụ trách load và phục vụ người dùng"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
